/**
 * PanelEstudianteLlevaMateria.java
 */

 /**
 *  AdSec: Administrador de Secundarias
 *  Copyright (C) 2009 Daniela Ramírez Chaves (dannyrch@gmail.com)
 *  Copyright (C) 2009 Leonel Salazar Valverde (leo87sv@gmail.com)
 *
 *  This file is part of AdSec.
 *  AdSec is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation, either version 3 of the License, or
 *  (at your option) any later version.
 *
 *  AdSec is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with AdSec.  If not, see <http://www.gnu.org/licenses/>.
 */

package adsec.presentacion;

import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.util.Iterator;
import java.util.LinkedList;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JComboBox;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.table.DefaultTableModel;
import adsec.entidades.Anio;
import adsec.entidades.Estado;
import adsec.entidades.Estudiante;
import adsec.entidades.LlaveValor;
import adsec.entidades.MateriaCursada;
import adsec.entidades.MatriculaEstudiante;
import adsec.entidades.Nivel;
import adsec.entidades.Permiso;
import adsec.entidades.Seccion;
import adsec.negocios.AdministradorSeguridad;
import adsec.negocios.ControladoraMatriculaEstudiante;
import adsec.negocios.UtilidadesCapaNegocios;
import org.jdesktop.application.Action;


public class PanelEstudianteLlevaMateria extends JPanel implements ItemListener{

    private AdministradorSeguridad admSeguridad;
    private Permiso permisoEstLlevaMateria;
    private Estado estado;
    private LinkedList<Seccion> listaSecciones;
    private LinkedList<MateriaCursada> listaMaterias;
    private LinkedList<MatriculaEstudiante> listaMatricula;
    private LinkedList<MatriculaEstudiante> listaEliminarMatricula;
    private ControladoraMatriculaEstudiante contMatriculaEstudiante;
    private final static int AGREGAR = 1;
    private final static int INSERTAR = 2;
    private final int columnaBorrar = 0;
    private boolean[] puedeEditarColumna = new boolean [] {
        false, false, false, false, false,false
    };

    /** Creates new form PanelNivelSeccion */
    public PanelEstudianteLlevaMateria() {
        initComponents();
        //this.iniciarPanelEstudianteLlevaMateria();
    }

    public void iniciarPanelEstudianteLlevaMateria(){
        this.admSeguridad = AdministradorSeguridad.getInstancia();
        this.permisoEstLlevaMateria = this.admSeguridad.getPermiso(UtilidadesCapaNegocios.moduloMateriasMatriculadas);
        this.estado = new Estado();
        this.estado.setEstadoActual(Estado.CONSULTAR);
        this.contMatriculaEstudiante = new ControladoraMatriculaEstudiante();
        this.listaSecciones = new LinkedList<Seccion>();
        this.listaMaterias = new LinkedList<MateriaCursada>();
        this.listaMatricula = new LinkedList<MatriculaEstudiante>();
        this.listaEliminarMatricula = new LinkedList<MatriculaEstudiante>();
        this.habilitarCampos(false);
        this.habilitarBotonesIME(this.permisoEstLlevaMateria.isInsertar()||this.permisoEstLlevaMateria.isModificar(), false);
        this.habilitarAceptarCancelar(false);
        if(this.permisoEstLlevaMateria.isConsultar()){
            this.cargarAños();
            this.cargarComboBoxDatosEstudiante();
        }
        this.limpiarCampos();
    }

    private void limpiarCampos(){
        if(estado.getEstadoActual() != Estado.INSERTAR){
            this.cbAño.setSelectedIndex(-1);
            this.cbCedula.setSelectedIndex(-1);
            this.cbNombreApellidos.setSelectedIndex(-1);
        }
        this.cbNivel.setSelectedIndex(-1);
        this.cbSeccion.setSelectedIndex(-1);
        this.cbMaterias.setSelectedIndex(-1);
        this.cbTipoMatricula.setSelectedIndex(-1);
        this.txtCupo.setText(""); 
    }

    private void habilitarCampos(boolean habilitar){
        this.cbNivel.setEnabled(habilitar);
        this.cbSeccion.setEnabled(habilitar);
        this.cbMaterias.setEnabled(habilitar);
        this.cbTipoMatricula.setEnabled(habilitar);
        this.btnAgregar.setEnabled(habilitar);
        this.btnBorrarSeleccionados.setEnabled(habilitar);
        this.puedeEditarColumna[this.columnaBorrar] = habilitar;
    }

    private void habilitarBotonesIME(boolean insertar, boolean eliminar){
        this.btnInsertar.setEnabled(insertar);
        this.btnEliminar.setEnabled(eliminar);
    }
    
    private void habilitarAceptarCancelar(boolean habilitar){
        this.btnAceptar.setEnabled(habilitar);
        this.btnCancelar.setEnabled(habilitar);
    }

    public void itemStateChanged(ItemEvent evento){
        JComboBox fuente = (JComboBox) evento.getSource();
        boolean encontrado = false;
        if(evento.getStateChange() == ItemEvent.SELECTED){
            if(fuente == this.cbCedula){
                this.cbNombreApellidos.removeItemListener(this);
                this.cbNombreApellidos.setSelectedIndex(this.cbCedula.getSelectedIndex());
                this.cbNombreApellidos.addItemListener(this);
                encontrado = true;
            }
            if(!encontrado && fuente == this.cbNombreApellidos){
                this.cbCedula.removeItemListener(this);
                this.cbCedula.setSelectedIndex(this.cbNombreApellidos.getSelectedIndex());
                this.cbCedula.addItemListener(this);
                encontrado = true;
            }
            if(!encontrado && fuente.equals(this.cbSeccion)){
                this.txtCupo.setText("");
                this.seleccionaronSeccion();
                encontrado = true;
            }
            if((fuente.equals(this.cbNivel) || fuente.equals(this.cbAño)
                || fuente.equals(this.cbCedula) || fuente.equals(this.cbNombreApellidos)) &&
                estado.getEstadoActual() == Estado.INSERTAR){
                this.cargarSecciones();
                this.txtCupo.setText("");
                this.cargarMaterias();
                encontrado = true;
            }
            if((fuente.equals(this.cbAño) || fuente.equals(this.cbCedula)
                || fuente.equals(this.cbNombreApellidos)) ){
                this.cargarGridConsultaMatricula();
            }
            if(fuente.equals(this.cbMaterias)){
                this.cargarTiposMatricula();
            }
        }
    }//fin de itemStateChanged

    private void cargarGridConsultaMatricula(){
        this.limpiarGridMaterias();
        if(this.permisoEstLlevaMateria.isConsultar()){
            if(this.cbAño.getSelectedIndex() > 0 && this.cbCedula.getSelectedIndex() > 0){
                int año = Integer.parseInt(this.cbAño.getSelectedItem().toString());
                LinkedList<MatriculaEstudiante> listaTemp = contMatriculaEstudiante.consultarMateriasMatriculadas(año, this.cbCedula.getSelectedItem().toString());
                Iterator<MatriculaEstudiante> iterador = listaTemp.iterator();
                while(iterador.hasNext()){
                    this.agregarMateriaMatriculada(iterador.next());
                }//fin while
                boolean valor = estado.getEstadoActual() == Estado.CONSULTAR && !listaMatricula.isEmpty();
                this.btnEliminar.setEnabled(valor && this.permisoEstLlevaMateria.isEliminar());
            }else{
                this.btnEliminar.setEnabled(false);
            }
        }//fin if
    }//fin método cargarGridConsultarMatricula

    private void seleccionaronSeccion(){
        int index = this.cbSeccion.getSelectedIndex();
        if(index > 0){
            Seccion seccion = listaSecciones.get(index-1);
            int cantidadEstudiantes = this.contMatriculaEstudiante.obtenerCantidadEstudiantesSeccion(seccion);
            int cupo = seccion.getCupoMaximo() - cantidadEstudiantes;
            this.txtCupo.setText(Integer.toString(cupo));
            if(cupo <= 0){
                String mensaje = "El cupo en la sección " + cbNivel.getSelectedItem().toString() + " esta lleno, escoja otra sección por favor";
                JOptionPane.showMessageDialog(null, mensaje, "Cupo lleno", JOptionPane.WARNING_MESSAGE);
                this.cbSeccion.setSelectedIndex(0);
                this.txtCupo.setText("");
            }
        }
    }

    private void cargarAños(){     
        ((DefaultComboBoxModel)cbAño.getModel()).removeAllElements();
        LinkedList<Anio> años = this.contMatriculaEstudiante.consultarAnios();
        Iterator<Anio> iterador = años.iterator();
        ((DefaultComboBoxModel)this.cbAño.getModel()).addElement("");
        while(iterador.hasNext()){
            String elemento = Integer.toString(iterador.next().getAnio());
            ((DefaultComboBoxModel)this.cbAño.getModel()).addElement(elemento);
        }
    }

    private void cargarNiveles(){
        ((DefaultComboBoxModel)cbNivel.getModel()).removeAllElements();
        LinkedList<Nivel> niveles = this.contMatriculaEstudiante.consultarNivelesTodos();
        Iterator<Nivel> iterador = niveles.iterator();
        ((DefaultComboBoxModel)this.cbNivel.getModel()).addElement("");
        while(iterador.hasNext()){
            String elemento = Integer.toString(iterador.next().getNivel());
            ((DefaultComboBoxModel)this.cbNivel.getModel()).addElement(elemento);
        }
    }

    private void cargarSecciones(){
        if(this.cbAño.getSelectedIndex() > 0 && this.cbNivel.getSelectedIndex() > 0){
            ((DefaultComboBoxModel)cbSeccion.getModel()).removeAllElements();
            Anio año = new Anio();
            Nivel nivel = new Nivel();
            año.setAnio(Integer.parseInt(this.cbAño.getSelectedItem().toString()));
            nivel.setNivel(Integer.parseInt(this.cbNivel.getSelectedItem().toString()));
            listaSecciones = this.contMatriculaEstudiante.consultarSecciones(año, nivel);
            ((DefaultComboBoxModel)this.cbSeccion.getModel()).addElement("");
            Iterator<Seccion> iterador = listaSecciones.iterator();
            while(iterador.hasNext()){
                Seccion sec = iterador.next();
                String elemento = Integer.toString(sec.getSeccion());
                ((DefaultComboBoxModel)this.cbSeccion.getModel()).addElement(elemento);
            }
        }
    }

    private void cargarComboBoxDatosEstudiante(){
        LinkedList<Estudiante> listaEstudiantes = this.contMatriculaEstudiante.consultarEstudiantes();
        DefaultComboBoxModel modeloCedula = new DefaultComboBoxModel();
        DefaultComboBoxModel modeloNombreApellidos = new DefaultComboBoxModel();
        modeloCedula.addElement("");
        modeloNombreApellidos.addElement("");
        Iterator<Estudiante> iterador = listaEstudiantes.iterator();
        while(iterador.hasNext()){
            Estudiante estudiante = iterador.next();
            modeloCedula.addElement(estudiante.getCedula());
            modeloNombreApellidos.addElement(estudiante.getNombre() + " " + estudiante.getApellidos());
        }//fin de while
        this.cbCedula.setModel(modeloCedula);
        this.cbNombreApellidos.setModel(modeloNombreApellidos);
    }//fin de cargarComboBoxDatosEstudiante

    private void cargarMaterias(){
        if(this.cbAño.getSelectedIndex() > 0 && this.cbNivel.getSelectedIndex() > 0 && this.cbCedula.getSelectedIndex() > 0){
            ((DefaultComboBoxModel)cbMaterias.getModel()).removeAllElements();
            int año = Integer.parseInt(this.cbAño.getSelectedItem().toString());
            int nivel = Integer.parseInt(this.cbNivel.getSelectedItem().toString());
            this.listaMaterias = this.contMatriculaEstudiante.obtenerMateriasNoAprobadas(año, nivel, this.cbCedula.getSelectedItem().toString());
            ((DefaultComboBoxModel)this.cbMaterias.getModel()).addElement("Todas");
            Iterator<MateriaCursada> iterador = this.listaMaterias.iterator();
            while(iterador.hasNext()){
                MateriaCursada materia = iterador.next();
                ((DefaultComboBoxModel)this.cbMaterias.getModel()).addElement(materia.getNombre());
            }
        }
    }

    private void cargarTiposMatricula(){
        if(this.cbMaterias.getSelectedIndex() > -1){
            ((DefaultComboBoxModel)cbTipoMatricula.getModel()).removeAllElements();
            for(int i = 0; i < MatriculaEstudiante.tiposMatricula.length; i++){
                ((DefaultComboBoxModel)this.cbTipoMatricula.getModel()).addElement(MatriculaEstudiante.tiposMatricula[i]);
            }
        }
    }

    private boolean verificarDatosObligatorios(int accion){
        boolean resultado = true;
        resultado &= (cbAño.getSelectedIndex() != -1) && (cbAño.getSelectedItem() != null) && (cbAño.getSelectedIndex() != 0);
        resultado &= (cbCedula.getSelectedIndex() != -1) && (cbCedula.getSelectedItem() != null) && (cbCedula.getSelectedIndex() != 0);
        resultado &= (cbNivel.getSelectedIndex() != -1) && (cbNivel.getSelectedItem() != null) && (cbNivel.getSelectedIndex() != 0);
        resultado &= (cbSeccion.getSelectedIndex() != -1) && (cbSeccion.getSelectedItem() != null) && (cbSeccion.getSelectedIndex() != 0);
        resultado &= (cbMaterias.getSelectedIndex() != -1) && (cbMaterias.getSelectedItem() != null);
        resultado &= (cbTipoMatricula.getSelectedIndex() != -1) && (cbTipoMatricula.getSelectedItem() != null);
        String mensaje ="El año, el estudiante, nivel, seccion";
        if(accion == AGREGAR){
            mensaje += " y la materia";
        }
        if(accion == INSERTAR){
            resultado = !this.listaMatricula.isEmpty();
            mensaje += ", materia, estado y la lista de materias a matricular";
        }
        if(!resultado){
            JOptionPane.showMessageDialog(null, mensaje,"ERROR",JOptionPane.ERROR_MESSAGE);
        }
        return resultado;
    }

    private void insertarMatriculaEstudiante(){
        boolean listaLlena = !this.listaEliminarMatricula.isEmpty();
        int eliminar = this.eliminarRegistroMatricula(this.listaEliminarMatricula, true);
        if(eliminar == UtilidadesCapaNegocios.QUERY_HALF_OK){
            int respuesta = JOptionPane.showConfirmDialog(null,
                    "El estudiante cuenta con notas registradas en algunas de las materias y secciones\n"+
                    " que eliminó de la lista.\n¿Está seguro que desea continuar?", "Atención" ,JOptionPane.YES_NO_OPTION,JOptionPane.WARNING_MESSAGE);
            eliminar = (respuesta == JOptionPane.YES_OPTION) ? UtilidadesCapaNegocios.QUERY_OK : eliminar;
            if(eliminar == UtilidadesCapaNegocios.QUERY_OK){
                //Se llama de nuevo al eliminar, pero esta vez no se verifica si
                //existen notas asociadas a la materia ya que el usuario dio su aprobación
                eliminar = this.eliminarRegistroMatricula(this.listaEliminarMatricula, false);
            }
        }
        if(eliminar == UtilidadesCapaNegocios.QUERY_OK){
            
            boolean hiceCambios = listaLlena;
            if(this.listaMatricula.size() > 0){
                int resultado = UtilidadesCapaNegocios.QUERY_OK;
                Iterator<MatriculaEstudiante> iterador = listaMatricula.iterator();
                while(iterador.hasNext() && resultado == UtilidadesCapaNegocios.QUERY_OK){
                    MatriculaEstudiante registro = iterador.next();
                    if(!registro.isEstadoMateria()){
                        hiceCambios = true;
                        if(!existeMatricula(registro) ){
                            resultado = this.contMatriculaEstudiante.insertarRegistroMatricula(registro);
                        }else{
                            resultado = UtilidadesCapaNegocios.QUERY_ERROR;
                        }
                    }
                }
                if(!hiceCambios){
                    JOptionPane.showMessageDialog(null,"No se realizó ningún cambio en la matrícula");
                }else{
                    if(resultado == UtilidadesCapaNegocios.QUERY_OK){
                        this.gridMaterias.getSelectionModel().clearSelection();
                        JOptionPane.showMessageDialog(null, "La matrícula del estudiante fue insertada exitosamente", "Inserción Exitosa", JOptionPane.INFORMATION_MESSAGE);
                        this.volverConsultar();
                    }else{
                        String mensaje = UtilidadesCapaNegocios.getErrorOperacion(UtilidadesCapaNegocios.moduloMateriasMatriculadas, UtilidadesCapaNegocios.opInsertar);
                        JOptionPane.showMessageDialog(null, mensaje, "ERROR",JOptionPane.ERROR_MESSAGE);
                    }
                }
            }
        }else{
            String mensaje = "No se pudo eliminar uno o más registros de matrícula, posibles problemas: " +
                              "\n1.El estudiante tiene registrada notas a estas materias matriculas" +
                              "\n2.Ocurrió un problema al borrar el registro de matrícula";
            JOptionPane.showMessageDialog(null, mensaje);
        }
    }

    private boolean existeMatricula(MatriculaEstudiante registro){
        LinkedList<LlaveValor> listaLlaveValor = new LinkedList<LlaveValor>();
        listaLlaveValor.add(new LlaveValor(MatriculaEstudiante.cedulaNC, registro.getCedula()));
        listaLlaveValor.add(new LlaveValor(MatriculaEstudiante.idMateriaNC, registro.getIdMateria()));
        listaLlaveValor.add(new LlaveValor(MatriculaEstudiante.idMateriaCursadaNC, registro.getIdMateriaCursada()));
        listaLlaveValor.add(new LlaveValor(MatriculaEstudiante.anioNC, registro.getAnio()));
        listaLlaveValor.add(new LlaveValor(MatriculaEstudiante.nivelNC, registro.getNivel()));
        listaLlaveValor.add(new LlaveValor(MatriculaEstudiante.seccionNC, registro.getSeccion()));
        boolean resultado = UtilidadesCapaNegocios.existenLlaves(MatriculaEstudiante.nombreTabla, listaLlaveValor);
        return resultado;
    }

    @Action
    public void insertandoMatricula() {
        this.estado.setEstadoActual(Estado.INSERTAR);
        this.habilitarAceptarCancelar(true);
        this.habilitarBotonesIME(false, false);
        this.cargarNiveles();
        this.limpiarCampos();
        ((DefaultComboBoxModel)cbSeccion.getModel()).removeAllElements();
        this.listaSecciones.clear();
        ((DefaultComboBoxModel)cbMaterias.getModel()).removeAllElements();
        this.listaMaterias.clear();
        this.habilitarCampos(true);
    }

    /**
     ** Muestra un mensaje de confirmación para que el usuario decida si realmente
     ** quiere llevar a cabo una operación
     ** @param operacion Código de operación realizada, tomada de UtilidadesCapaNegocios
     ** @param titulo Título a mostrar en el cuadro de confirmación
     ** @return Confirmación: true si el usuario acepta, false en otro caso.
     **/
    private boolean mostrarMensajeConfirmacion(int operacion,String titulo){
        boolean resultado = true;
        String mensaje = UtilidadesCapaNegocios.getMensajeConfirmacion(UtilidadesCapaNegocios.moduloMateriasMatriculadas, operacion);
        int respuesta = JOptionPane.showConfirmDialog(null, mensaje,titulo ,JOptionPane.YES_NO_OPTION,JOptionPane.WARNING_MESSAGE);
        resultado = respuesta == JOptionPane.OK_OPTION;
        return resultado;
    }//fin de mostrarMensajeConfirmacion

    private void volverConsultar(){
        this.estado.setEstadoActual(Estado.CONSULTAR);
        this.habilitarBotonesIME(permisoEstLlevaMateria.isInsertar() || permisoEstLlevaMateria.isModificar(), false);
        this.habilitarCampos(false);
        this.cbNivel.setSelectedIndex(-1);
        this.cbSeccion.setSelectedIndex(-1);
        this.cbMaterias.setSelectedIndex(-1);
        this.cbTipoMatricula.setSelectedIndex(-1);
        this.txtCupo.setText("");
        this.cargarGridConsultaMatricula();
        this.habilitarAceptarCancelar(false);
    }

    @Action
    public void accionAceptar() {
        Animador.animar();
        switch(estado.getEstadoActual()){
            case Estado.INSERTAR:
                if(this.mostrarMensajeConfirmacion(UtilidadesCapaNegocios.opInsertar, "INSERTAR")){
                    if(this.verificarDatosObligatorios(INSERTAR)){
                        this.insertarMatriculaEstudiante();
                    }
                }
            break;
        }
        Animador.detenerAnimacion();
    }

    @Action
    public void accionCancelar() {
        this.limpiarCampos();
        this.volverConsultar();
    }

    @Action
    public void agregarRegistro() {
        if(verificarDatosObligatorios(AGREGAR)){
            String error = "";
            LinkedList<MatriculaEstudiante> lista = this.obtenerDatosMatricula();
            Iterator<MatriculaEstudiante> iterador = lista.iterator();
            while(iterador.hasNext()){
                MatriculaEstudiante matricula = iterador.next();
                if(listaMatricula.isEmpty()){
                    this.listaMatricula.add(matricula);
                    this.agregarRegistroGridMaterias(matricula,-1);
                }else{
                    error += this.agregarMateriaMatriculada(matricula);
                }//fin else
            }//fin while
            if(!error.isEmpty()){
                JOptionPane.showMessageDialog(null, error, "Matrícula", JOptionPane.WARNING_MESSAGE);
            }
        }//fin if
    }

    private String agregarMateriaMatriculada(MatriculaEstudiante matricula){
        int i = 0;
        boolean encontrado = false;
        String error = "";
        boolean estaEnLaLista = false;
        while(!encontrado && !estaEnLaLista && i < listaMatricula.size()){
            MatriculaEstudiante matriculaEst = this.listaMatricula.get(i);
            if(!matriculaEst.equals(matricula)){
                if(matriculaEst.compareTo(matricula) > 0){
                    i++;
                }else{
                    encontrado = true;
                }//fin if/else
            }else{
               estaEnLaLista = true;
               error = "La materia " + matricula.getNombreMateria() + " del nivel "
                                + matricula.getNivel() + " ya fue matriculada.\n" ;
            }//fin if/else
        }//fin while
        if(!estaEnLaLista){
            if(i < listaMatricula.size()){
                listaMatricula.add(i, matricula);
                this.agregarRegistroGridMaterias(matricula,i);
            }else{
                listaMatricula.add(matricula);
                this.agregarRegistroGridMaterias(matricula,-1);
            }//fin if/else
        }
        return error;
    }


    @Action
    public void borrarSeleccionados() {
        DefaultTableModel modelo = (DefaultTableModel)this.gridMaterias.getModel();
        for(int fila = modelo.getRowCount()-1; fila >= 0; fila--){
            Boolean borrar = (Boolean) modelo.getValueAt(fila, this.columnaBorrar);
            if(borrar.booleanValue()){
                modelo.removeRow(fila);
                if(this.listaMatricula.get(fila).isEstadoMateria()){
                    this.listaEliminarMatricula.add(listaMatricula.get(fila));
                }
                this.listaMatricula.remove(fila);
            }
        }//fin de for
    }

    private LinkedList<MatriculaEstudiante> obtenerDatosMatricula(){
        LinkedList<MatriculaEstudiante> lista = new LinkedList<MatriculaEstudiante>();
        int año = Integer.parseInt(cbAño.getSelectedItem().toString());
        int nivel = Integer.parseInt(cbNivel.getSelectedItem().toString());
        int seccion = Integer.parseInt(cbSeccion.getSelectedItem().toString());
        String cedula = cbCedula.getSelectedItem().toString();
        String opcion = cbMaterias.getSelectedItem().toString();
        if(opcion.equals("Todas")){
            Iterator<MateriaCursada> iterador = listaMaterias.iterator();
            while(iterador.hasNext()){
                MatriculaEstudiante matricula = new MatriculaEstudiante();
                matricula.setAnio(año);
                matricula.setNivel(nivel);
                matricula.setSeccion(seccion);
                matricula.setCedula(cedula);
                MateriaCursada materia = iterador.next();
                matricula.setCantidad_periodos(materia.getCantidadPeriodos());
                matricula.setIdMateria(materia.getIdMateria());
                matricula.setIdMateriaCursada(materia.getIdMateriaCursada());
                matricula.setNombreMateria(materia.getNombre());
                matricula.setEstadoMateria(false);
                matricula.setTipoMatricula(this.cbTipoMatricula.getSelectedIndex());
                lista.add(matricula);
            }
        }else{
            int index = cbMaterias.getSelectedIndex();
            MateriaCursada materia = listaMaterias.get(index-1);
            MatriculaEstudiante matricula = new MatriculaEstudiante();
            matricula.setAnio(año);
            matricula.setNivel(nivel);
            matricula.setSeccion(seccion);
            matricula.setCedula(cedula);
            matricula.setCantidad_periodos(materia.getCantidadPeriodos());
            matricula.setIdMateria(materia.getIdMateria());
            matricula.setIdMateriaCursada(materia.getIdMateriaCursada());
            matricula.setNombreMateria(materia.getNombre());
            matricula.setEstadoMateria(false);
            matricula.setTipoMatricula(this.cbTipoMatricula.getSelectedIndex());
            lista.add(matricula);
        }
        return lista;
    }

    private void agregarRegistroGridMaterias(MatriculaEstudiante matricula, int lugar){
        Object arregloDatos[] = new Object[6];
        arregloDatos[0] = false;
        arregloDatos[1] = matricula.getNivel();
        arregloDatos[2] = matricula.getSeccion();
        arregloDatos[3] = matricula.getNombreMateria();
        arregloDatos[4] = MatriculaEstudiante.tiposMatricula[matricula.getTipoMatricula()];
        arregloDatos[5] = matricula.isEstadoMateria() ? "Matriculada" : "";
        if(lugar < 0){
            ((DefaultTableModel)this.gridMaterias.getModel()).addRow(arregloDatos);
        }else{
            ((DefaultTableModel)this.gridMaterias.getModel()).insertRow(lugar, arregloDatos);
        }
    }//fin de cargarGridEstudiantes

    private void limpiarGridMaterias(){
        ((DefaultTableModel)this.gridMaterias.getModel()).setRowCount(0);
        this.listaMatricula.clear();
        this.listaEliminarMatricula.clear();
    }

    @Action
    public void eliminarMatricula() {
        if(this.permisoEstLlevaMateria.isEliminar()){
            if(this.cbAño.getSelectedIndex() > 0 && this.cbCedula.getSelectedIndex() > 0){
                if(this.mostrarMensajeConfirmacion(UtilidadesCapaNegocios.opEliminar, "ELIMINAR")){
                    //int año = Integer.parseInt(this.cbAño.getSelectedItem().toString());
                    //this.contMatriculaEstudiante.eliminarMatriculaEstudiante(año, this.cbCedula.getSelectedItem().toString());
                    int resultado = this.eliminarRegistroMatricula(listaMatricula, true);
                    if(resultado == UtilidadesCapaNegocios.QUERY_HALF_OK){
                        String mensaje = "Algunas materias matriculadas no se pudieron borrar debido a que tienen notas asociadas";
                        JOptionPane.showMessageDialog(null, mensaje, "Error al eliminar", JOptionPane.ERROR_MESSAGE);
                    }
                    if(resultado == UtilidadesCapaNegocios.QUERY_ERROR){
                        JOptionPane.showMessageDialog(null, "Ocurrió un error al eliminar registro de matricula, inténtelo de nuevo", "Error al eliminar", JOptionPane.ERROR_MESSAGE);
                    }
                    this.cargarGridConsultaMatricula();
                }
            }//fin if
        }//fin if
    }//fin eliminarMatricula

    private int eliminarRegistroMatricula(LinkedList<MatriculaEstudiante> listaEliminar, boolean verificar){
        int resultado = UtilidadesCapaNegocios.QUERY_OK;
        if(!listaEliminar.isEmpty()){
            Iterator<MatriculaEstudiante> iterador = listaEliminar.iterator();
            while(resultado == UtilidadesCapaNegocios.QUERY_OK && iterador.hasNext()){
                MatriculaEstudiante matriculaEliminar = iterador.next();
                int puedoEliminar = 0;
                if(verificar){
                    puedoEliminar = contMatriculaEstudiante.existeRegistroNotasMatricula(matriculaEliminar);
                }
                if(puedoEliminar == 0 ){
                    resultado = this.contMatriculaEstudiante.eliminarRegistroMatricula(matriculaEliminar);
                    if(resultado == UtilidadesCapaNegocios.QUERY_OK){
                        iterador.remove();
                    }
                }else{
                    if(puedoEliminar > 0){
                        resultado = UtilidadesCapaNegocios.QUERY_HALF_OK;
                    }
                    if(puedoEliminar < 0){
                        resultado = UtilidadesCapaNegocios.QUERY_ERROR;
                    }
                }
            }
        }
        return resultado;
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        lbEstudiante = new javax.swing.JLabel();
        btnInsertar = new javax.swing.JButton();
        btnEliminar = new javax.swing.JButton();
        cbCedula = new javax.swing.JComboBox();
        cbNombreApellidos = new javax.swing.JComboBox();
        panelMaterias = new javax.swing.JPanel();
        lbNivel = new javax.swing.JLabel();
        cbNivel = new javax.swing.JComboBox();
        lbSeccion = new javax.swing.JLabel();
        cbSeccion = new javax.swing.JComboBox();
        lbMateria = new javax.swing.JLabel();
        cbMaterias = new javax.swing.JComboBox();
        scrollTablaMaterias = new javax.swing.JScrollPane();
        gridMaterias = new javax.swing.JTable();
        btnAgregar = new javax.swing.JButton();
        btnBorrarSeleccionados = new javax.swing.JButton();
        lbCupo = new javax.swing.JLabel();
        txtCupo = new javax.swing.JTextField();
        lbTipoMatricula = new javax.swing.JLabel();
        cbTipoMatricula = new javax.swing.JComboBox();
        btnCancelar = new javax.swing.JButton();
        btnAceptar = new javax.swing.JButton();
        jLabel1 = new javax.swing.JLabel();
        cbAño = new javax.swing.JComboBox();

        setMaximumSize(new java.awt.Dimension(740, 480));
        setMinimumSize(new java.awt.Dimension(740, 480));
        setName("Form"); // NOI18N
        setPreferredSize(new java.awt.Dimension(740, 480));

        org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance(adsec.presentacion.LiceoEscazuApp.class).getContext().getResourceMap(PanelEstudianteLlevaMateria.class);
        lbEstudiante.setText(resourceMap.getString("lbEstudiante.text")); // NOI18N
        lbEstudiante.setName("lbEstudiante"); // NOI18N

        javax.swing.ActionMap actionMap = org.jdesktop.application.Application.getInstance(adsec.presentacion.LiceoEscazuApp.class).getContext().getActionMap(PanelEstudianteLlevaMateria.class, this);
        btnInsertar.setAction(actionMap.get("insertandoMatricula")); // NOI18N
        btnInsertar.setText(resourceMap.getString("btnInsertar.text")); // NOI18N
        btnInsertar.setName("btnInsertar"); // NOI18N

        btnEliminar.setAction(actionMap.get("eliminarMatricula")); // NOI18N
        btnEliminar.setText(resourceMap.getString("btnEliminar.text")); // NOI18N
        btnEliminar.setName("btnEliminar"); // NOI18N

        cbCedula.setName("cbCedula"); // NOI18N

        cbNombreApellidos.setName("cbNombreApellidos"); // NOI18N

        panelMaterias.setBorder(javax.swing.BorderFactory.createTitledBorder(resourceMap.getString("panelMaterias.border.title"))); // NOI18N
        panelMaterias.setName("panelMaterias"); // NOI18N

        lbNivel.setText(resourceMap.getString("lbNivel.text")); // NOI18N
        lbNivel.setName("lbNivel"); // NOI18N

        cbNivel.setName("cbNivel"); // NOI18N

        lbSeccion.setText(resourceMap.getString("lbSeccion.text")); // NOI18N
        lbSeccion.setName("lbSeccion"); // NOI18N

        cbSeccion.setName("cbSeccion"); // NOI18N

        lbMateria.setText(resourceMap.getString("lbMateria.text")); // NOI18N
        lbMateria.setName("lbMateria"); // NOI18N

        cbMaterias.setName("cbMaterias"); // NOI18N

        scrollTablaMaterias.setName("scrollTablaMaterias"); // NOI18N

        gridMaterias.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {

            },
            new String [] {
                "Seleccione", "Nivel", "Sección", "Materia", "Tipo de Matrícula", "Estado"
            }
        ) {
            Class[] types = new Class [] {
                java.lang.Boolean.class, java.lang.Object.class, java.lang.Object.class, java.lang.Object.class, java.lang.Object.class, java.lang.Object.class
            };
            boolean[] canEdit = new boolean [] {
                true, false, false, false, false, false
            };

            public Class getColumnClass(int columnIndex) {
                return types [columnIndex];
            }

            public boolean isCellEditable(int rowIndex, int columnIndex) {
                return puedeEditarColumna [columnIndex];
            }
        });
        gridMaterias.setName("gridMaterias"); // NOI18N
        scrollTablaMaterias.setViewportView(gridMaterias);
        gridMaterias.getColumnModel().getColumn(0).setHeaderValue(resourceMap.getString("gridMaterias.columnModel.title0")); // NOI18N
        gridMaterias.getColumnModel().getColumn(1).setHeaderValue(resourceMap.getString("gridMaterias.columnModel.title1")); // NOI18N
        gridMaterias.getColumnModel().getColumn(2).setHeaderValue(resourceMap.getString("gridMaterias.columnModel.title2")); // NOI18N
        gridMaterias.getColumnModel().getColumn(3).setHeaderValue(resourceMap.getString("gridMaterias.columnModel.title3")); // NOI18N

        btnAgregar.setAction(actionMap.get("agregarRegistro")); // NOI18N
        btnAgregar.setText(resourceMap.getString("btnAgregar.text")); // NOI18N
        btnAgregar.setName("btnAgregar"); // NOI18N

        btnBorrarSeleccionados.setAction(actionMap.get("borrarSeleccionados")); // NOI18N
        btnBorrarSeleccionados.setText(resourceMap.getString("btnBorrarSeleccionados.text")); // NOI18N
        btnBorrarSeleccionados.setName("btnBorrarSeleccionados"); // NOI18N

        lbCupo.setText(resourceMap.getString("lbCupo.text")); // NOI18N
        lbCupo.setName("lbCupo"); // NOI18N

        txtCupo.setEditable(false);
        txtCupo.setText(resourceMap.getString("txtCupo.text")); // NOI18N
        txtCupo.setName("txtCupo"); // NOI18N

        lbTipoMatricula.setText(resourceMap.getString("lbTipoMatricula.text")); // NOI18N
        lbTipoMatricula.setName("lbTipoMatricula"); // NOI18N

        cbTipoMatricula.setMaximumRowCount(4);
        cbTipoMatricula.setName("cbTipoMatricula"); // NOI18N

        javax.swing.GroupLayout panelMateriasLayout = new javax.swing.GroupLayout(panelMaterias);
        panelMaterias.setLayout(panelMateriasLayout);
        panelMateriasLayout.setHorizontalGroup(
            panelMateriasLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelMateriasLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(panelMateriasLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(scrollTablaMaterias, javax.swing.GroupLayout.DEFAULT_SIZE, 680, Short.MAX_VALUE)
                    .addGroup(panelMateriasLayout.createSequentialGroup()
                        .addGroup(panelMateriasLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                            .addComponent(lbNivel)
                            .addComponent(lbMateria))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(panelMateriasLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addGroup(panelMateriasLayout.createSequentialGroup()
                                .addComponent(cbNivel, javax.swing.GroupLayout.PREFERRED_SIZE, 75, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(lbSeccion)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(cbSeccion, javax.swing.GroupLayout.PREFERRED_SIZE, 76, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(lbCupo)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(txtCupo, javax.swing.GroupLayout.PREFERRED_SIZE, 41, javax.swing.GroupLayout.PREFERRED_SIZE))
                            .addGroup(panelMateriasLayout.createSequentialGroup()
                                .addComponent(cbMaterias, javax.swing.GroupLayout.PREFERRED_SIZE, 255, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(lbTipoMatricula)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(cbTipoMatricula, javax.swing.GroupLayout.PREFERRED_SIZE, 140, javax.swing.GroupLayout.PREFERRED_SIZE))))
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, panelMateriasLayout.createSequentialGroup()
                        .addComponent(btnAgregar)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(btnBorrarSeleccionados)))
                .addContainerGap())
        );
        panelMateriasLayout.setVerticalGroup(
            panelMateriasLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelMateriasLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(panelMateriasLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(lbCupo)
                    .addComponent(txtCupo, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(cbNivel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(lbNivel)
                    .addComponent(lbSeccion)
                    .addComponent(cbSeccion, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(18, 18, 18)
                .addGroup(panelMateriasLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(lbMateria)
                    .addComponent(cbMaterias, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(lbTipoMatricula)
                    .addComponent(cbTipoMatricula, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(panelMateriasLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(btnBorrarSeleccionados)
                    .addComponent(btnAgregar))
                .addGap(4, 4, 4)
                .addComponent(scrollTablaMaterias, javax.swing.GroupLayout.DEFAULT_SIZE, 180, Short.MAX_VALUE)
                .addContainerGap())
        );

        this.cbNivel.addItemListener(this);
        this.cbSeccion.addItemListener(this);
        this.cbMaterias.addItemListener(this);

        btnCancelar.setAction(actionMap.get("accionCancelar")); // NOI18N
        btnCancelar.setText(resourceMap.getString("btnCancelar.text")); // NOI18N
        btnCancelar.setName("btnCancelar"); // NOI18N

        btnAceptar.setAction(actionMap.get("accionAceptar")); // NOI18N
        btnAceptar.setText(resourceMap.getString("btnAceptar.text")); // NOI18N
        btnAceptar.setName("btnAceptar"); // NOI18N

        jLabel1.setText(resourceMap.getString("jLabel1.text")); // NOI18N
        jLabel1.setName("jLabel1"); // NOI18N

        cbAño.setMinimumSize(new java.awt.Dimension(80, 24));
        cbAño.setName("cbAño"); // NOI18N
        cbAño.setPreferredSize(new java.awt.Dimension(80, 24));

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
        this.setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                            .addGroup(layout.createSequentialGroup()
                                .addContainerGap()
                                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                    .addComponent(jLabel1, javax.swing.GroupLayout.Alignment.TRAILING)
                                    .addComponent(lbEstudiante, javax.swing.GroupLayout.Alignment.TRAILING))
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                    .addGroup(layout.createSequentialGroup()
                                        .addComponent(cbCedula, javax.swing.GroupLayout.PREFERRED_SIZE, 149, javax.swing.GroupLayout.PREFERRED_SIZE)
                                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                        .addComponent(cbNombreApellidos, javax.swing.GroupLayout.PREFERRED_SIZE, 373, javax.swing.GroupLayout.PREFERRED_SIZE))
                                    .addComponent(cbAño, javax.swing.GroupLayout.PREFERRED_SIZE, 68, javax.swing.GroupLayout.PREFERRED_SIZE))
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 40, Short.MAX_VALUE))
                            .addGroup(layout.createSequentialGroup()
                                .addContainerGap()
                                .addComponent(btnAceptar)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)))
                        .addComponent(btnCancelar))
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                        .addContainerGap(522, Short.MAX_VALUE)
                        .addComponent(btnInsertar)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(btnEliminar))
                    .addGroup(layout.createSequentialGroup()
                        .addContainerGap()
                        .addComponent(panelMaterias, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(btnEliminar)
                    .addComponent(btnInsertar))
                .addGap(18, 18, 18)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel1)
                    .addComponent(cbAño, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(lbEstudiante)
                    .addComponent(cbCedula, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(cbNombreApellidos, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(18, 18, 18)
                .addComponent(panelMaterias, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(btnCancelar)
                    .addComponent(btnAceptar))
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );

        this.cbCedula.addItemListener(this);
        this.cbNombreApellidos.addItemListener(this);
        this.cbAño.addItemListener(this);
    }// </editor-fold>//GEN-END:initComponents


    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton btnAceptar;
    private javax.swing.JButton btnAgregar;
    private javax.swing.JButton btnBorrarSeleccionados;
    private javax.swing.JButton btnCancelar;
    private javax.swing.JButton btnEliminar;
    private javax.swing.JButton btnInsertar;
    private javax.swing.JComboBox cbAño;
    private javax.swing.JComboBox cbCedula;
    private javax.swing.JComboBox cbMaterias;
    private javax.swing.JComboBox cbNivel;
    private javax.swing.JComboBox cbNombreApellidos;
    private javax.swing.JComboBox cbSeccion;
    private javax.swing.JComboBox cbTipoMatricula;
    private javax.swing.JTable gridMaterias;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel lbCupo;
    private javax.swing.JLabel lbEstudiante;
    private javax.swing.JLabel lbMateria;
    private javax.swing.JLabel lbNivel;
    private javax.swing.JLabel lbSeccion;
    private javax.swing.JLabel lbTipoMatricula;
    private javax.swing.JPanel panelMaterias;
    private javax.swing.JScrollPane scrollTablaMaterias;
    private javax.swing.JTextField txtCupo;
    // End of variables declaration//GEN-END:variables

}
